//
// This software is now distributed according to
// the Lesser Gnu Public License. Please see
// http://www.gnu.org/copyleft/lesser.txt for
// the details.
// -- Happy Computing!
//
package com.stevesoft.pat;

import java.util.Hashtable;

/** Thrown when one encounters things like [z-a] */
class BadRangeArgs extends RegSyntax {
};

/**
 * Implments a subelement (ranges) of the [] pattern element. For example,
 * [a-z023] is implemented using a range and tree oneChar classes.
 * 
 * @see Bracket
 * @see oneChar
 */
class Range extends Pattern {

	char lo, hi, altlo, althi;
	boolean printBrackets = false;

	public String toString() {
		String s = protect("" + lo, PROTECT_THESE, ESC) + "-" + protect("" + hi, PROTECT_THESE, ESC);
		if (!printBrackets)
			return s;
		return "[" + s + "]";
	}

	Range(char loi, char hii) throws RegSyntax {
		lo = loi;
		hi = hii;
		oneChar o = null;
		if (lo >= hi)
			// throw new BadRangeArgs();
			RegSyntaxError.endItAll("Badly formed []'s : " + lo + " >= " + hi);
		o = new oneChar(lo);
		altlo = o.altc;
		o = new oneChar(hi);
		althi = o.altc;
	}

	public int matchInternal(int pos, Pthings pt) {
		if (pos >= pt.src.length())
			return -1;
		if (Masked(pos, pt))
			return -1;
		char c = pt.src.charAt(pos);
		if (lo <= c && c <= hi || (pt.ignoreCase && (altlo <= c && c <= althi)))
			return nextMatch(pos + 1, pt);
		return -1;
	}

	public patInt minChars() {
		return new patInt(1);
	}

	public patInt maxChars() {
		return new patInt(1);
	}

	public Pattern clone1(Hashtable h) {
		try {
			Range r = new Range(lo, hi);
			r.printBrackets = printBrackets;
			return r;
		} catch (RegSyntax rs) {
			return null;
		}
	}
};
